import cv2 as cv
import  numpy as np


def add_demo(m1, m2):
    dst = cv.add(m1, m2)  # 像素加运算,大于255则默认为255
    cv.imshow("add_demo", dst)


def subtract_demo(m1, m2):
    dst = cv.subtract(m1, m2)  # 像素减运算，小于0则默认为0
    cv.imshow("subtract_demo", dst)


def divide_demo(m1, m2):
    dst = cv.divide(m1, m2)  # 像素除运算
    cv.imshow("divide_demo", dst)


def multiply_demo(m1, m2):
    dst = cv.multiply(m1, m2)  # 像素乘运算，在相乘的时候，图案“Linux”边缘上的像素并不稳定
    cv.imshow("multiply_demo", dst)


def others(m1, m2):
    # M1 = cv.mean(m1)  # 求图像的均值
    # M2 = cv.mean(m2)
    M1, dev1 = cv.meanStdDev(m1)  # 求得图像的均值和方差
    M2, dev2 = cv.meanStdDev(m2)
    print(M1)
    print(M2)
    print(dev1)
    print(dev2)


def logic_demo(m1, m2):
    dst_and = cv.bitwise_and(m1, m2)  # 与运算  每个像素点每个通道的值按位与，即只有两个像素点都不为0时才会有输出
    cv.imshow("logic_demo_and", dst_and)
    dst_or = cv.bitwise_or(m1, m2)  # 或运算  即只要两个像素不全为零就会有输出
    cv.imshow("logic_demo_or", dst_or)
    dst_not = cv.bitwise_not(m1)  # 非运算  即只要两个像素不全为零就会有输出
    cv.imshow("logic_demo_not", dst_not)


def contrast_brightness_demo(image, c, b):  # c代表对比度，b代表亮度
    h, w, ch = image.shape
    blank = np.zeros([h, w, ch], image.dtype)  # 创建于image图像完全相同的空白图像
    dst = cv.addWeighted(image, c, blank, 1-c, b)
    # 第一个数值表示需要加权的第一个数组，第二个数值表示第一个数组的权重，第三个数值表示第二个数组（和第一个数组必须大小类型相同），第四个数值表示第二个数组的权重，第五个数值表示一个加到权重总和上的标量值
    cv.imshow("con_bri_demo", dst)


#  像素运算，两幅图像的大小、类型必须完全一致才能进行运算
src1 = cv.imread("C:/Users/HP_USER/PycharmProjects/image_process/imgs/test003.png")
src2 = cv.imread("C:/Users/HP_USER/PycharmProjects/image_process/imgs/test004.jpg")
print(src1.shape)
print(src1.shape)
cv.imshow("src1", src1)
cv.imshow("src2", src2)
# add_demo(src1, src2)
# subtract_demo(src1, src2)
# divide_demo(src1, src2)
# multiply_demo(src1, src2)
# others(src1, src2)
# logic_demo(src1, src2)
contrast_brightness_demo(src2, 1.2, 10)
cv.waitKey(0)
cv.destroyAllWindows()
